
package org.uca.dss.curso1011.grupo3.gestionreservas;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;
import org.uca.dss.curso1011.grupo3.interfaz.InterfazListados;

/**
 * Permite obtener un listado con la disponibilidad horaria para realizar un
 * determinado viaje.
 *
 * @author Adolfo Barroso, Levi Orta, Juan Manuel Chaves
 */
public class ListadoDisponibilidad implements InterfazListados{

    //Atributo de la clase
    protected GestionReservas gestionReservas;


    /**
     * Constructor de la clase ListadoDisponibilidad. Prepara lo necesario para
     * pader generar un listado de disponibilidad horaria para realizar un
     * determinado viaje.
     *
     */
    public ListadoDisponibilidad(String ficheroTrenes, String ficheroTrayecto) throws FileNotFoundException, IOException
    {
        gestionReservas = new GestionReservas(ficheroTrenes,ficheroTrayecto);
    }

    /**
     * Devuelve una lista con los horarios de salida que todavia estan disponibles
     * para realizar un trayecto donde la ciudad de origen, destino y la fecha
     * concreta del viaje.
     *
     * @param origen ciudad origen
     * @param destino ciudad destino
     * @param fecha fecha del viaje
     * @return un array con las horas de partida disponibles
     */
    @Override
    public List<LocalTime> getHorarios(String origen, String destino, LocalDate fecha) {
        
        //obtener toda la lista de trayectos
        List<Trayecto> trayectos = gestionReservas.getTrayectos(origen, destino);
        List<LocalTime> horasPartidas = new ArrayList<LocalTime>();

        int num_trayectos = trayectos.size();

        //Se recorren todos los trayectos que tienen como origen y destino
        //los dados por los parametros de entrada
        for(int i=0; i < num_trayectos; i++)
        {
            Map<LocalTime,LocalTime> horas = trayectos.get(i).getHorasSalidaLllegada();

            Iterator it = horas.entrySet().iterator();
            while (it.hasNext())
            {
                Map.Entry e = (Map.Entry)it.next();

                //Si exite asientos libres para el trayecto, inserto la hora de
                //salida a la lista
                if(gestionReservas.asientosLibres(origen, destino, fecha, (LocalTime) e.getKey()) > 0)
                    horasPartidas.add((LocalTime) e.getKey());
            }
        }

        return horasPartidas;        
    }

    public Map<LocalTime,LocalTime> getHorariosTrayecto(Trayecto trayecto, LocalDate fecha) {

        Map<LocalTime,LocalTime> horasSL = new HashMap<LocalTime,LocalTime>();

        Map<LocalTime,LocalTime> horas = trayecto.getHorasSalidaLllegada();

        Iterator it = horas.entrySet().iterator();
        while (it.hasNext())
        {
            Map.Entry e = (Map.Entry)it.next();

            //Si exite asientos libres para el trayecto, inserto la hora de
            //salida a la lista
            if(gestionReservas.asientosLibres(trayecto.getOrigen(), trayecto.getDestino(), fecha, (LocalTime) e.getKey()) > 0)
                horasSL.put((LocalTime) e.getKey(), (LocalTime) e.getValue());
        }

        return horasSL;
    }
}
